home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / MFCEXINC.PAK / SYSDEFS.H < prev    next >
C/C++ Source or Header  |  1997-05-06  |  74KB  |  1,881 lines

  1. //---------------------------------------------------------------------------
  2. //    sysdefs.h - support for properties & vcl intrinsic types
  3. //---------------------------------------------------------------------------
  4. // $Revision:   10.0  $
  5. //-------------------------------------------------------------------------
  6. //    copyright (c) 1997 Borland International
  7. //----------------------------------------------------------------------------
  8. #ifndef SYSDEFS_H
  9. #define SYSDEFS_H
  10. #if __BORLANDC__ < 0x500
  11. #error BCW 5.0 or greater required
  12. #endif
  13.  
  14. //---------------------------------------------------------------------------
  15. #pragma option -w-lvc       // turn off "temp used for param" warnings
  16. #pragma option -w-inl       // turn off "cannot expand inline..." warnings
  17.  
  18. #pragma anon_struct on      // support anonymous structs (within unions)
  19. //---------------------------------------------------------------------------
  20. #include <stdlib.h>
  21. #include <stdio.h>
  22. #ifdef SEEK_SET
  23. #undef SEEK_SET
  24. #undef SEEK_CUR
  25. #undef SEEK_END
  26. #endif
  27. #include <string.h>
  28. #include <dstring.h>
  29. //---------------------------------------------------------------------------
  30. #define DYNAMIC
  31. #define MESSAGE
  32. #define HIDESBASE __declspec(hidesbase)
  33.  
  34. extern "C" __int64 _roundToInt64(long double);
  35.  
  36. //---------------------------------------------------------------------------
  37. //forward declarations
  38. //
  39. namespace Ole2
  40. {
  41.   class IUnknown;
  42.   class IDispatch;
  43. }
  44.  
  45. namespace Classes
  46. {
  47.   class TPersistent;
  48. }
  49. using namespace Classes;
  50.  
  51. namespace System
  52. {
  53.  
  54. class __declspec(delphireturn) Variant;
  55.  
  56. //---------------------------------------------------------------------------
  57. class TMetaClass;
  58. //---------------------------------------------------------------------------
  59. typedef TMetaClass* TClass;
  60. //---------------------------------------------------------------------------
  61. //---------------------------------------------------------------------------
  62. class __declspec(delphireturn) CurrencyBase
  63. {
  64.   public:
  65.     __int64 Val;
  66. };
  67. //---------------------------------------------------------------------------
  68. class __declspec(delphireturn) Currency : public CurrencyBase
  69. {
  70.   friend Currency __fastcall operator +(int lhs, const Currency& rhs);
  71.   friend Currency __fastcall operator -(int lhs, const Currency& rhs);
  72.   friend Currency __fastcall operator *(int lhs, const Currency& rhs);
  73.   friend Currency __fastcall operator /(int lhs, const Currency& rhs);
  74.   friend Currency __fastcall operator +(double lhs, const Currency& rhs);
  75.   friend Currency __fastcall operator -(double lhs, const Currency& rhs);
  76.   friend Currency __fastcall operator *(double lhs, const Currency& rhs);
  77.   friend Currency __fastcall operator /(double lhs, const Currency& rhs);
  78.   public:
  79.     __fastcall Currency()                        {Val = 0;}
  80.     __fastcall Currency(double val)         {Val = _roundToInt64(10000 * val);}
  81.     __fastcall Currency(int val)           {Val = 10000*(__int64)val;}
  82.     __fastcall Currency(const CurrencyBase& src) {Val = src.Val;}
  83.     __fastcall Currency(const Currency& src)     {Val = src.Val;}
  84.     __fastcall Currency(const AnsiString& src);
  85.  
  86.     Currency& __fastcall operator =(double rhs)
  87.     {
  88.     Val = _roundToInt64(10000 * rhs);
  89.     return *this;
  90.     }
  91.     Currency& __fastcall operator =(int rhs)
  92.       {Val = 10000*(__int64)rhs; return *this;}
  93.     Currency& __fastcall operator =(const CurrencyBase& rhs)
  94.       {Val=rhs.Val;return *this;}
  95.     Currency& __fastcall operator =(const Currency& rhs)
  96.       {Val = rhs.Val; return *this;}
  97.  
  98.     Currency& __fastcall operator +=(const Currency& rhs)
  99.       {Val += rhs.Val; return *this;}
  100.     Currency& __fastcall operator -=(const Currency& rhs)
  101.       {Val -= rhs.Val; return *this;}
  102.     Currency& __fastcall operator *=(const Currency& rhs)
  103.       {Val *= rhs.Val; Val /= 10000; return *this;}
  104.     Currency& __fastcall operator /=(const Currency& rhs)
  105.       {Val *= 10000; Val /= rhs.Val; return *this;}
  106.     Currency& __fastcall operator %=(int rhs)
  107.       {Val %= 10000 * (__int64)rhs; return *this;}
  108.  
  109.     Currency& operator ++() {Val += 10000; return *this;}
  110.     Currency operator ++(int) {Currency tmp(*this); Val += 10000; return tmp;}
  111.     Currency& operator --() {Val -= 10000; return *this;}
  112.     Currency operator --(int) {Currency tmp(*this); Val -= 10000; return tmp;}
  113.  
  114.     Currency __fastcall operator +(const Currency& rhs) const
  115.       {Currency tmp(*this); return tmp += rhs;}
  116.     Currency __fastcall operator -(const Currency& rhs) const
  117.       {Currency tmp(*this); return tmp -= rhs;}
  118.     Currency __fastcall operator *(const Currency& rhs) const
  119.       {Currency tmp(*this); return tmp *= rhs;}
  120.     Currency __fastcall operator /(const Currency& rhs) const
  121.       {Currency tmp(*this); return tmp /= rhs;}
  122.  
  123.     Currency __fastcall operator +(int rhs) const
  124.       {Currency tmp(*this); return tmp += Currency(rhs);}
  125.     Currency __fastcall operator -(int rhs) const
  126.       {Currency tmp(*this); return tmp -= Currency(rhs);}
  127.     Currency __fastcall operator *(int rhs) const
  128.       {Currency tmp(*this); return tmp *= Currency(rhs);}
  129.     Currency __fastcall operator /(int rhs) const
  130.       {Currency tmp(*this); return tmp /= Currency(rhs);}
  131.     Currency __fastcall operator %(int rhs) const
  132.       {return Currency(static_cast<int>(Val % (10000 * (__int64)rhs))) / 10000;}
  133.  
  134.     Currency __fastcall operator +(double rhs) const
  135.       {Currency tmp(*this); return tmp += Currency(rhs);}
  136.     Currency __fastcall operator -(double rhs) const
  137.       {Currency tmp(*this); return tmp -= Currency(rhs);}
  138.     Currency __fastcall operator *(double rhs) const
  139.       {Currency tmp(*this); return tmp *= Currency(rhs);}
  140.     Currency __fastcall operator /(double rhs) const
  141.       {Currency tmp(*this); return tmp /= Currency(rhs);}
  142.  
  143.     Currency __fastcall operator -() const
  144.       {Currency tmp(*this); tmp.Val = -(tmp.Val); return tmp;}
  145.  
  146.     Currency __fastcall operator !() const
  147.       {Currency tmp(*this); tmp.Val = !(tmp.Val); return tmp;}
  148.  
  149.     // comparisons (Currency rhs)
  150.     bool __fastcall operator ==(const Currency& rhs) const
  151.       {return Val == rhs.Val;}
  152.     bool __fastcall operator !=(const Currency& rhs) const
  153.       {return Val != rhs.Val;}
  154.     bool __fastcall operator >(const Currency& rhs) const
  155.       {return Val > rhs.Val;}
  156.     bool __fastcall operator <(const Currency& rhs) const
  157.       {return Val < rhs.Val;}
  158.     bool __fastcall operator >=(const Currency& rhs) const
  159.       {return Val >= rhs.Val;}
  160.     bool __fastcall operator <=(const Currency& rhs) const
  161.       {return Val <= rhs.Val;}
  162.  
  163.     // comparisons (int rhs)
  164.     bool __fastcall operator ==(int rhs) const
  165.       {return Val == 10000 * (__int64)rhs;}
  166.     bool __fastcall operator !=(int rhs) const
  167.       {return Val != 10000 * (__int64)rhs;}
  168.     bool __fastcall operator >(int rhs) const
  169.       {return Val > 10000 * (__int64)rhs;}
  170.     bool __fastcall operator <(int rhs) const
  171.       {return Val < 10000 * (__int64)rhs;}
  172.     bool __fastcall operator >=(int rhs) const
  173.       {return Val >= 10000 * (__int64)rhs;}
  174.     bool __fastcall operator <=(int rhs) const
  175.       {return Val <= 10000 * (__int64)rhs;}
  176.  
  177.     // comparisons (double rhs)
  178.     bool __fastcall operator ==(double rhs) const
  179.       {return Val == _roundToInt64(10000 * (long double)rhs);}
  180.     bool __fastcall operator !=(double rhs) const
  181.       {return Val != _roundToInt64(10000 * (long double)rhs);}
  182.     bool __fastcall operator >(double rhs) const
  183.       {return Val > _roundToInt64(10000 * (long double)rhs);}
  184.     bool __fastcall operator <(double rhs) const
  185.       {return Val < _roundToInt64(10000 * (long double)rhs);}
  186.     bool __fastcall operator >=(double rhs) const
  187.       {return Val >= _roundToInt64(10000 * (long double)rhs);}
  188.     bool __fastcall operator <=(double rhs) const
  189.       {return Val <= _roundToInt64(10000 * (long double)rhs);}
  190.  
  191.     __fastcall operator double() const {return ((double)Val) / 10000;}
  192.     __fastcall operator int() const    {return (int) (Val / 10000);}
  193.     __fastcall operator AnsiString() const;
  194. };
  195. //Currency friends
  196. inline Currency __fastcall operator +(int lhs, const Currency& rhs)
  197.   {Currency tmp(lhs); return tmp += rhs;}
  198. inline Currency __fastcall operator -(int lhs, const Currency& rhs)
  199.   {Currency tmp(lhs); return tmp -= rhs;}
  200. inline Currency __fastcall operator *(int lhs, const Currency& rhs)
  201.   {Currency tmp(lhs); return tmp *= rhs;}
  202. inline Currency __fastcall operator /(int lhs, const Currency& rhs)
  203.   {Currency tmp(lhs); return tmp /= rhs;}
  204. inline Currency __fastcall operator +(double lhs, const Currency& rhs)
  205.   {Currency tmp(lhs); return tmp += rhs;}
  206. inline Currency __fastcall operator -(double lhs, const Currency& rhs)
  207.   {Currency tmp(lhs); return tmp -= rhs;}
  208. inline Currency __fastcall operator *(double lhs, const Currency& rhs)
  209.   {Currency tmp(lhs); return tmp *= rhs;}
  210. inline Currency __fastcall operator /(double lhs, const Currency& rhs)
  211.   {Currency tmp(lhs); return tmp /= rhs;}
  212. //---------------------------------------------------------------------------
  213. inline ostream& operator <<(ostream& os, const Currency& arg)
  214.     {os << AnsiString(arg); return os;}
  215. inline istream& operator >>(istream& is, Currency& arg)
  216.     {AnsiString s; is >> s; arg = s; return is;}
  217. //---------------------------------------------------------------------------
  218. class __declspec(delphireturn) TDateTimeBase
  219. {
  220.   public:
  221.     double Val;
  222. };
  223. //---------------------------------------------------------------------------
  224. class __declspec(delphireturn) TDateTime : public TDateTimeBase
  225. {
  226.   public:
  227.     // Used by TDateTime(const AnsiString& src)
  228.     enum TDateTimeFlag {Date, Time, DateTime};
  229.  
  230.     static TDateTime __fastcall CurrentDate();
  231.     static TDateTime __fastcall CurrentTime();
  232.     static TDateTime __fastcall CurrentDateTime();
  233.     static TDateTime __fastcall FileDateToDateTime(int fileDate);
  234.  
  235.     __fastcall TDateTime()                                  {Val = 0;}
  236.     __fastcall TDateTime(const TDateTimeBase& src)          {Val = src.Val;}
  237.     __fastcall TDateTime(const TDateTime& src)              {Val = src.Val;}
  238.     __fastcall TDateTime(const double src)                  {Val = src;}
  239.     __fastcall TDateTime(const int src)                     {Val = src;}
  240.     __fastcall TDateTime(const AnsiString& src, TDateTimeFlag flag = DateTime);
  241.     __fastcall TDateTime(unsigned short year, unsigned short month,
  242.                          unsigned short day);
  243.     __fastcall TDateTime(unsigned short hour, unsigned short min,
  244.                          unsigned short sec, unsigned short msec);
  245.  
  246.     TDateTime& __fastcall operator =(const TDateTimeBase& rhs)
  247.       {Val = rhs.Val;return *this;}
  248.     TDateTime& __fastcall operator =(const TDateTime& rhs)
  249.       {Val = rhs.Val;  return *this;}
  250.     TDateTime& __fastcall operator =(const double rhs)
  251.       {Val = rhs; return *this;}
  252.     TDateTime& __fastcall operator =(const int rhs)
  253.       {Val = rhs; return *this;}
  254.  
  255.     TDateTime& __fastcall operator +=(const TDateTimeBase& rhs)
  256.       {Val+=rhs.Val;return *this;}
  257.     TDateTime& __fastcall operator +=(const TDateTime& rhs)
  258.       {Val += rhs.Val; return *this;}
  259.     TDateTime& __fastcall operator +=(const double rhs)
  260.       {Val += rhs; return *this;}
  261.     TDateTime& __fastcall operator +=(const int rhs)
  262.       {Val += rhs; return *this;}
  263.  
  264.     TDateTime& __fastcall operator -=(const TDateTimeBase& rhs)
  265.       {Val-=rhs.Val;return *this;}
  266.     TDateTime& __fastcall operator -=(const TDateTime& rhs)
  267.       {Val -= rhs.Val; return *this;}
  268.     TDateTime& __fastcall operator -=(const double rhs)
  269.       {Val -= rhs; return *this;}
  270.     TDateTime& __fastcall operator -=(const int rhs)
  271.       {Val -= rhs; return *this;}
  272.  
  273.     TDateTime& operator ++() {Val++; return *this;}
  274.     TDateTime operator ++(int) {TDateTime tmp(*this); Val++; return tmp;}
  275.     TDateTime& operator --() {Val--; return *this;}
  276.     TDateTime operator --(int) {TDateTime tmp(*this); Val--; return tmp;}
  277.  
  278.     TDateTime __fastcall operator +(const TDateTimeBase& rhs) const
  279.       {return Val+rhs.Val;}
  280.     TDateTime __fastcall operator +(const TDateTime& rhs) const
  281.       {return Val+rhs.Val;}
  282.     TDateTime __fastcall operator +(const double rhs) const {return Val+rhs;}
  283.     TDateTime __fastcall operator +(const int rhs) const {return Val+rhs;}
  284.  
  285.     TDateTime __fastcall operator -(const TDateTimeBase& rhs) const
  286.       {return Val-rhs.Val;}
  287.     TDateTime __fastcall operator -(const TDateTime& rhs) const
  288.       {return Val-rhs.Val;}
  289.     TDateTime __fastcall operator -(const double rhs) const {return Val-rhs;}
  290.     TDateTime __fastcall operator -(const int rhs) const {return Val-rhs;}
  291.  
  292.     // comparisons
  293.     bool __fastcall operator ==(const TDateTime& rhs) const
  294.       {return Val == rhs.Val;}
  295.     bool __fastcall operator !=(const TDateTime& rhs) const
  296.       {return Val != rhs.Val;}
  297.     bool __fastcall operator >(const TDateTime& rhs) const
  298.       {return Val > rhs.Val;}
  299.     bool __fastcall operator <(const TDateTime& rhs) const
  300.       {return Val < rhs.Val;}
  301.     bool __fastcall operator >=(const TDateTime& rhs) const
  302.       {return Val >= rhs.Val;}
  303.     bool __fastcall operator <=(const TDateTime& rhs) const
  304.       {return Val <= rhs.Val;}
  305.  
  306.     __fastcall operator AnsiString() const;//<Date||Time||DateTime>String(smart)
  307.     AnsiString __fastcall FormatString(const AnsiString& format);
  308.     AnsiString __fastcall DateString() const;
  309.     AnsiString __fastcall TimeString() const;
  310.     AnsiString __fastcall DateTimeString() const;
  311.     __fastcall operator double() const {return Val;}
  312.     __fastcall operator int() const    {return (int)Val;}
  313.  
  314.     int __fastcall DayOfWeek() const;
  315.     int __fastcall FileDate() const;
  316.     void __fastcall DecodeDate(unsigned short* year, unsigned short*
  317.       month, unsigned short* day) const;
  318.     void __fastcall DecodeTime(unsigned short* hour, unsigned short*
  319.       min, unsigned short* sec, unsigned short* msec) const;
  320. };
  321. //---------------------------------------------------------------------------
  322. inline ostream& operator <<(ostream& os, const TDateTime& arg)
  323.     {os << AnsiString(arg); return os;}
  324. inline istream& operator >>(istream& is, TDateTime& arg)
  325.     {AnsiString s; is >> s; arg = s; return is;}
  326. //---------------------------------------------------------------------------
  327. //class TObject {};
  328. typedef SmallString<255> ShortString;
  329. class   __declspec(delphiclass) TObject
  330. {
  331.   public:
  332.     __fastcall TObject() {}
  333.     __fastcall Free();
  334.     TClass __fastcall ClassType();
  335.     void __fastcall CleanupInstance();
  336.     void * __fastcall FieldAddress(const ShortString &Name);
  337.  
  338.     static TObject * __fastcall InitInstance(TClass cls, void *instance);
  339.     static ShortString __fastcall ClassName(TClass cls);
  340.     static bool __fastcall ClassNameIs(TClass cls, const AnsiString string);
  341.     static TClass __fastcall ClassParent(TClass cls);
  342.     static void * __fastcall ClassInfo(TClass cls);
  343.     static long __fastcall InstanceSize(TClass cls);
  344.     static bool __fastcall InheritsFrom(TClass cls, TClass aClass);
  345.     static void * __fastcall MethodAddress(TClass cls, const ShortString &Name);
  346.     static ShortString __fastcall MethodName(TClass cls, void *Address);
  347.  
  348.     ShortString __fastcall ClassName()
  349.     {
  350.       return ClassName(ClassType());
  351.     }
  352.  
  353.     bool __fastcall ClassNameIs(const AnsiString string)
  354.     {
  355.       return ClassNameIs(ClassType(), string);
  356.     }
  357.  
  358.     TClass __fastcall ClassParent()
  359.     {
  360.       return ClassParent(ClassType());
  361.     }
  362.  
  363.     void * __fastcall ClassInfo()
  364.     {
  365.       return ClassInfo(ClassType());
  366.     }
  367.  
  368.     long __fastcall InstanceSize()
  369.     {
  370.       return InstanceSize(ClassType());
  371.     }
  372.  
  373.     bool __fastcall InheritsFrom(TClass aClass)
  374.     {
  375.       return InheritsFrom(ClassType(), aClass);
  376.     }
  377.  
  378.     void * __fastcall MethodAddress(const ShortString &Name)
  379.     {
  380.       return MethodAddress(ClassType(), Name);
  381.     }
  382.  
  383.     ShortString __fastcall MethodName(void *Address)
  384.     {
  385.       return MethodName(ClassType(), Address);
  386.     }
  387.  
  388.     virtual void __fastcall AfterConstruction();
  389.     virtual void __fastcall BeforeDestruction();
  390.     virtual void __fastcall Dispatch(void *Message);
  391.     virtual void __fastcall DefaultHandler(void* Message);
  392.  
  393.   private:
  394.     virtual TObject* __fastcall NewInstance(TClass cls);
  395.  
  396.   public:
  397.     virtual void __fastcall FreeInstance();
  398.     virtual __fastcall ~TObject() {}
  399. };
  400.  
  401. class   TMetaClass
  402. {
  403.   public:
  404.     TObject * __fastcall InitInstance(void *instance)
  405.     {
  406.       TObject::InitInstance(this, instance);
  407.     }
  408.  
  409.     ShortString __fastcall ClassName()
  410.     {
  411.       return TObject::ClassName(this);
  412.     }
  413.  
  414.     bool __fastcall ClassNameIs(const AnsiString &string)
  415.     {
  416.       return    TObject::ClassNameIs(this,string);
  417.     }
  418.  
  419.     TClass __fastcall ClassParent()
  420.     {
  421.       return TObject::ClassParent(this);
  422.     }
  423.  
  424.     void * __fastcall ClassInfo()
  425.     {
  426.       return TObject::ClassInfo(this);
  427.     }
  428.  
  429.     long __fastcall InstanceSize()
  430.     {
  431.       return TObject::InstanceSize(this);
  432.     }
  433.  
  434.     bool __fastcall InheritsFrom(TClass aClass)
  435.     {
  436.       return TObject::InheritsFrom(this, aClass);
  437.     }
  438.  
  439.     void * __fastcall MethodAddress(const ShortString &Name)
  440.     {
  441.       return TObject::MethodAddress(this, Name);
  442.     }
  443.  
  444.     ShortString __fastcall MethodName(void *Address)
  445.     {
  446.       return TObject::MethodName(this,Address);
  447.     }
  448. };
  449.  
  450. #ifndef BEGIN_MESSAGE_MAP
  451. #define BEGIN_MESSAGE_MAP       virtual void __fastcall Dispatch(void *Message) \
  452.                                 {                                               \
  453.                                         switch  (((PMessage)Message)->Msg)      \
  454.                                         {
  455. #define MESSAGE_HANDLER(msg,type,meth)                                          \
  456.                                         case    msg:                            \
  457.                                                 meth(*((type *)Message));       \
  458.                                                 break;
  459. #define END_MESSAGE_MAP(base)           default:                                \
  460.                                                                 base::Dispatch(Message);        \
  461.                                                         break;                          \
  462.                                         }                                                                                       \
  463.                                 }
  464. #endif
  465. //---------------------------------------------------------------------------
  466. typedef DummySmallString<255> DummyShortString;
  467. typedef bool Boolean;                   //
  468. typedef int Integer;                    // -2147483648..2147484647
  469. typedef char Char;                       // 0..255
  470. typedef wchar_t WideChar;               //
  471. typedef signed char Shortint;           // -128..127
  472. typedef short Smallint;                 // -32768..32767
  473. typedef unsigned char Byte;             // 0..255
  474. typedef unsigned short Word;            // 0..65535
  475. typedef unsigned long DWord;            // 0..4294967295
  476. typedef void* Pointer;                  //
  477. typedef Char AnsiChar;                  //
  478. typedef signed long Longint;            // -2147483648..2147484647
  479. typedef unsigned int Cardinal;            // 0..2147484647
  480. typedef long double Extended;           // 10 byte real
  481. typedef float Single;                   // 4 byte real
  482. typedef double Double;                  // 8 byte real
  483. typedef Char* const Openstring;         // D16 string/D32 shortstring formalparm
  484. typedef void* file;                     //
  485. typedef void* Text;                     //
  486. typedef Text TextFile;                  //
  487. typedef Char* PChar;                    //
  488. typedef PChar PAnsiChar;                //
  489. typedef WideChar* PWideChar;            //
  490. typedef Byte ByteBool;                  //
  491. typedef Word WordBool;                  //
  492. typedef Cardinal LongBool;              //
  493. typedef AnsiString String;              //
  494. typedef ShortString* PShortString;      //
  495. typedef AnsiString* PAnsiString;        //
  496. typedef PAnsiString PString;            //
  497. typedef Extended* PExtended;            //
  498. typedef Currency* PCurrency;            //
  499. typedef Variant* PVariant;              //
  500. typedef __int64 LONG64;                 //
  501.  
  502. // Comp
  503. // Range: -263+1 .. 263-1, Significant digits: 19-20, Size: 8
  504. // The Comp (computational) type holds only integral values within -263+1
  505. // to 263-1, which is approximately -9.2 * 1018 to 9.2 * 1018.
  506. //
  507. struct Comp {
  508.     operator =(double d);
  509.     operator =(Currency d);
  510.     operator double();
  511.     operator Currency();
  512.   private:
  513.     char __data[8];
  514. };
  515.  
  516. extern double   __cdecl CompToDouble(Comp acomp);
  517. extern void     __cdecl DoubleToComp(double adouble, Comp &result);
  518. extern Currency __cdecl CompToCurrency(Comp acomp);
  519. extern void     __cdecl CurrencyToComp(Currency acurrency, Comp &result);
  520.  
  521. inline Comp::operator = (double d) {
  522.   DoubleToComp(d, *this);
  523. }
  524.  
  525. inline Comp::operator double() {
  526.   return CompToDouble(*this);
  527. }
  528.  
  529. inline Comp::operator = (Currency d) {
  530.   CurrencyToComp(d, *this);
  531. }
  532.  
  533. inline Comp::operator Currency() {
  534.   return CompToCurrency(*this);
  535. }
  536.  
  537. //---------------------------------------------------------------------------
  538. // Set template implements Delphi sets
  539. //---------------------------------------------------------------------------
  540. template<class T, unsigned char minEl, unsigned char maxEl>
  541. class __declspec(delphireturn) Set
  542. {
  543.   friend ostream& operator <<(ostream& os, const Set& arg)
  544.   {
  545.     for (int i = minEl; i <= maxEl; i++)
  546.       if (arg.Contains(static_cast<T>(i)))
  547.         os << '1';
  548.       else
  549.         os << '0';
  550.     return os;
  551.   }
  552.  
  553.   friend istream& operator >>(istream& is, Set& arg)
  554.   {
  555.     unsigned char el;
  556.     for (int i = minEl; i <= maxEl; i++)
  557.     {
  558.       is >> el;
  559.       if (el == '1')
  560.         arg << static_cast<T>(i);
  561.     }
  562.     return is;
  563.   }
  564.   public:
  565.     __fastcall Set() {memset(Data, 0, sizeof (Data));}
  566.     __fastcall Set(const Set& src)
  567.     {
  568.       for (int i = 0; i < sizeof (Data); i++)
  569.         Data[i] = src.Data[i];
  570.     }
  571.  
  572.     Set& __fastcall operator =(const Set& rhs)
  573.     {
  574.       if (this != &rhs)
  575.       {
  576.         for (int i = 0; i < sizeof (Data); i++)
  577.           Data[i] = rhs.Data[i];
  578.       }
  579.       return *this;
  580.     }
  581.     Set& __fastcall operator +=(const Set& rhs) //Union
  582.     {
  583.       for (int i = 0; i < sizeof (Data); i++)
  584.         Data[i] |= rhs.Data[i];
  585.       return *this;
  586.     }
  587.     Set& __fastcall operator -=(const Set& rhs) //Difference
  588.     {
  589.       for (int i = 0; i < sizeof (Data); i++)
  590.         Data[i] ^= (Data[i] & rhs.Data[i]);
  591.       return *this;
  592.     }
  593.     Set& __fastcall operator *=(const Set& rhs) //Intersection
  594.     {
  595.       for (int i = 0; i < sizeof (Data); i++)
  596.         Data[i] &= rhs.Data[i];
  597.       return *this;
  598.     }
  599.  
  600.     Set __fastcall operator +(const Set& rhs) const //Union
  601.     {
  602.       Set<T, minEl, maxEl> s;
  603.       for (int i = 0; i < sizeof (Data); i++)
  604.         s.Data[i] = Data[i] | rhs.Data[i];
  605.       return s;
  606.     }
  607.     Set __fastcall operator -(const Set& rhs) const //Difference
  608.     {
  609.       Set<T, minEl, maxEl> s;
  610.       for (int i = 0; i < sizeof (Data); i++)
  611.         s.Data[i] = Data[i] ^ (Data[i] & rhs.Data[i]);
  612.       return s;
  613.     }
  614.     Set __fastcall operator *(const Set& rhs) const //Intersection
  615.     {
  616.       Set<T, minEl, maxEl> s;
  617.       for (int i = 0; i < sizeof (Data); i++)
  618.         s.Data[i] = Data[i] & rhs.Data[i];
  619.       return s;
  620.     }
  621.  
  622.     Set& __fastcall operator <<(const T el) //Add element
  623.     {
  624. #pragma warn -ccc
  625. #pragma warn -rng
  626.       if (el >= minEl && el <= maxEl)
  627. #pragma warn .ccc
  628. #pragma warn .rng
  629.         Data[(int)(el/8) - (int)(minEl/8)] |=
  630.           (unsigned char)((unsigned short)1 << (el % 8));
  631.       return *this;
  632.     }
  633.     Set& __fastcall operator >>(const T el) //Remove element
  634.     {
  635. #pragma warn -ccc
  636. #pragma warn -rng
  637.       if (el >= minEl && el <= maxEl)
  638. #pragma warn .ccc
  639. #pragma warn .rng
  640.         Data[(int)(el/8) - (int)(minEl/8)] &=
  641.           (unsigned char)~((unsigned short)1 << (el % 8));
  642.       return *this;
  643.     }
  644.  
  645.     bool __fastcall Contains(const T el) const
  646.     {
  647. #pragma warn -ccc
  648. #pragma warn -rng
  649.       return (el >= minEl && el <= maxEl)?
  650. #pragma warn .ccc
  651. #pragma warn .rng
  652.         (Data[(int)(el/8) - (int)(minEl/8)] &
  653.           (unsigned char)((unsigned short)1 << (el % 8))): false;
  654.     }
  655.  
  656.     Set& __fastcall Clear()
  657.     {
  658.       for (int i = 0; i < sizeof (Data); i++)
  659.         Data[i] = 0;
  660.       return *this;
  661.     }
  662.  
  663.     bool __fastcall operator ==(const Set& rhs) const
  664.     {
  665.       for (int i = 0; i < sizeof (Data); i++)
  666.         if (Data[i] != rhs.Data[i])
  667.           // Not so fast, if first or last byte, make sure that
  668.           // the compare does not include unused bits (mask them)
  669.           if (i == 0)
  670.           {
  671.             if(((0xFF >> (8-(minEl%8))) ^ Data[i]) !=
  672.                ((0xFF >> (8-(minEl%8))) ^ rhs.Data[i]))
  673.               return false;
  674.           }
  675.           else if (sizeof (Data) > 1 && i == sizeof (Data) - 1)
  676.           {
  677.             if(((0xFF << (1+(maxEl%8))) ^ Data[i]) !=
  678.                ((0xFF << (1+(maxEl%8))) ^ rhs.Data[i]))
  679.               return false;
  680.           }
  681.           else
  682.             return false;
  683.       return true;
  684.     }
  685.     bool __fastcall operator !=(const Set& rhs) const {return !operator==(rhs);}
  686.   protected:
  687.     unsigned char Data[((((int)(maxEl/8))-((int)(minEl/8))+1) != 3)?
  688.       (((int)(maxEl/8))-((int)(minEl/8))+1): 4];
  689. };
  690. //---------------------------------------------------------------------------
  691. template<class T, unsigned char minEl, unsigned char maxEl> class DummySet
  692. {
  693.   protected:
  694.     unsigned char Data[((((int)(maxEl/8))-((int)(minEl/8))+1) != 3)?
  695.       (((int)(maxEl/8))-((int)(minEl/8))+1): 4];
  696. };
  697. //---------------------------------------------------------------------------
  698.  
  699. class TVarArrayBound {
  700.   public:
  701.     Integer ElementCount;
  702.     Integer LowBound;
  703. };
  704.  
  705. typedef class TVarArray *PVarArray;
  706.  
  707. class TVarArray {
  708.   public:
  709.     Word DimCount;
  710.     Word Flags;
  711.     Integer ElementSize;
  712.     Integer LockCount;
  713.     Pointer Data;
  714.     TVarArrayBound Bounds[256] /* [0..255] */;
  715. };
  716. //---------------------------------------------------------------------------
  717. #define varEmpty (Byte)(0)
  718. #define varNull (Byte)(1)
  719. #define varSmallint (Byte)(2)
  720. #define varInteger (Byte)(3)
  721. #define varSingle (Byte)(4)
  722. #define varDouble (Byte)(5)
  723. #define varCurrency (Byte)(6)
  724. #define varDate (Byte)(7)
  725. #define varOleStr (Byte)(8)
  726. #define varDispatch (Byte)(9)
  727. #define varError (Byte)(10)
  728. #define varBoolean (Byte)(11)
  729. #define varVariant (Byte)(12)
  730. #define varUnknown (Byte)(13)
  731. #define varByte (Byte)(17)
  732. #define varString (Word)(256)
  733. #define varTypeMask (Word)(4095)
  734. #define varArray (Word)(8192)
  735. #define varByRef (Word)(16384)
  736. #define varStrArg (Byte)(72)
  737. //---------------------------------------------------------------------------
  738. #define vtInteger (Byte)(0)
  739. #define vtBoolean (Byte)(1)
  740. #define vtChar (Byte)(2)
  741. #define vtExtended (Byte)(3)
  742. #define vtString (Byte)(4)
  743. #define vtPointer (Byte)(5)
  744. #define vtPChar (Byte)(6)
  745. #define vtObject (Byte)(7)
  746. #define vtClass (Byte)(8)
  747. #define vtWideChar (Byte)(9)
  748. #define vtPWideChar (Byte)(10)
  749. #define vtAnsiString (Byte)(11)
  750. #define vtCurrency (Byte)(12)
  751. #define vtVariant (Byte)(13)
  752. //---------------------------------------------------------------------------
  753. typedef class TVarData *PVarData;
  754.  
  755. class TVarData {
  756.   public:
  757.     Word VType;
  758.     Word Reserved1;
  759.     Word Reserved2;
  760.     Word Reserved3;
  761.     union {
  762.       Smallint VSmallint;
  763.       Integer VInteger;
  764.       Single VSingle;
  765.       Double VDouble;
  766.       CurrencyBase VCurrency;
  767.       TDateTimeBase VDate;
  768.       PWideChar VOleStr;
  769.       Ole2::IDispatch* VDispatch;
  770.       Integer VError;
  771.       WordBool VBoolean;
  772.       Ole2::IUnknown* VUnknown;
  773.       Byte VByte;
  774.       Pointer VString;
  775.       PVarArray VArray;
  776.       Pointer VPointer;
  777.     };
  778. };
  779. //-----------------------------------------------------------------------
  780. class TVarRec;
  781. typedef TVarRec* PVarRec;
  782. class TVarRec
  783. {
  784.   public:
  785.     union
  786.     {
  787.       Integer      VInteger;
  788.       Boolean      VBoolean;
  789.       Char         VChar;
  790.       PExtended    VExtended;
  791.       PShortString VString;
  792.       Pointer      VPointer;
  793.       PChar        VPChar;
  794.       TObject*     VObject;
  795.       TClass       VClass;
  796.       WideChar     VWideChar;
  797.       PWideChar    VPWideChar;
  798.       Pointer      VAnsiString;
  799.       PCurrency    VCurrency;
  800.       PVariant     VVariant;
  801.     };
  802.     union
  803.     {
  804.       Byte VType;
  805.       long ForceAlignment; 
  806.     };
  807.  
  808.     //---- constructors ----
  809.     __fastcall TVarRec(): VType(vtInteger), VInteger(0) {} //default int 0
  810.     __fastcall TVarRec(Integer src): VType(vtInteger), VInteger(src) {}
  811.     __fastcall TVarRec(Boolean src): VType(vtBoolean), VBoolean(src) {}
  812.     __fastcall TVarRec(char src): VType(vtChar), VChar(src) {}
  813.     __fastcall TVarRec(const Extended& src): VType(vtExtended),
  814.       VExtended(const_cast<Extended*>(&src)) {}
  815.     __fastcall TVarRec(const ShortString& src): VType(vtString),
  816.       VString(const_cast<PShortString>(&src)) {}
  817.     __fastcall TVarRec(const Pointer src): VType(vtPointer), VPointer(src) {}
  818.     __fastcall TVarRec(const PChar src): VType(vtPChar), VPChar(src) {}
  819.     __fastcall TVarRec(const char* src): VType(vtPChar),
  820.       VPChar(reinterpret_cast<PChar>(const_cast<char*>(src))) {}
  821.     __fastcall TVarRec(const TObject& src): VType(vtObject),
  822.       VObject(const_cast<TObject*>(&src)) {}
  823.     __fastcall TVarRec(const TClass src): VType(vtClass), VClass(src) {}
  824.     __fastcall TVarRec(WideChar src): VType(vtWideChar), VWideChar(src) {}
  825.     __fastcall TVarRec(const PWideChar src): VType(vtPWideChar),
  826.       VPWideChar(src) {}
  827.     __fastcall TVarRec(const AnsiString src): VType(vtAnsiString),
  828.       VAnsiString(src.c_str()) {}
  829.     __fastcall TVarRec(const Currency& src): VType(vtCurrency),
  830.       VCurrency(const_cast<PCurrency>(&src)) {}
  831.     __fastcall TVarRec(const Variant& src): VType(vtVariant),
  832.       VVariant(const_cast<PVariant>(&src)) {}
  833.  
  834.     //---- assignments ----
  835.     __fastcall operator =(Integer src) {VType = vtInteger; VInteger = src;}
  836.     __fastcall operator =(Boolean src) {VType = vtBoolean; VBoolean = src;}
  837.     __fastcall operator =(char src) {VType = vtChar; VChar = src;}
  838.     __fastcall operator =(const Extended& src) {VType = vtExtended;
  839.       VExtended = const_cast<PExtended>(&src);}
  840.     __fastcall operator =(const ShortString& src) {VType = vtString;
  841.       VString = const_cast<PShortString>(&src);}
  842.     __fastcall operator =(const Pointer src) {VType = vtPointer;VPointer = src;}
  843.     __fastcall operator =(const PChar src) {VType = vtPChar; VPChar = src;}
  844.     __fastcall operator =(const char* src) {VType = vtPChar;
  845.       VPChar = reinterpret_cast<PChar>(const_cast<char*>(src));}
  846.     __fastcall operator =(const TObject& src) {VType = vtObject;
  847.       VObject = const_cast<TObject*>(&src);}
  848.     __fastcall operator =(const TClass src) {VType = vtClass; VClass = src;}
  849.     __fastcall operator =(WideChar src) {VType = vtWideChar; VWideChar = src;}
  850.     __fastcall operator =(const PWideChar src) {VType = vtPWideChar;
  851.       VPWideChar = src;}
  852.     __fastcall operator =(const AnsiString src) {VType = vtAnsiString;
  853.       VAnsiString = src.c_str();}
  854.     __fastcall operator =(const Currency& src) {VType = vtCurrency;
  855.       VCurrency = const_cast<PCurrency>(&src);}
  856.     __fastcall operator =(const Variant& src) {VType = vtVariant;
  857.       VVariant = const_cast<PVariant>(&src);}
  858. };
  859. //-----------------------------------------------------------------------
  860. template<class T> class OpenArray
  861. {
  862.   public:
  863.     __fastcall OpenArray(T arg0)
  864.     {
  865.       Array = new T[Count = 1];
  866.       Array[0] = arg0;
  867.     }
  868.     __fastcall OpenArray(T arg0, T arg1)
  869.     {
  870.       Array = new T[Count = 2];
  871.       Array[0] = arg0;
  872.       Array[1] = arg1;
  873.     }
  874.     __fastcall OpenArray(T arg0, T arg1, T arg2)
  875.     {
  876.       Array = new T[Count = 3];
  877.       Array[0] = arg0;
  878.       Array[1] = arg1;
  879.       Array[2] = arg2;
  880.     }
  881.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3)
  882.     {
  883.       Array = new T[Count = 4];
  884.       Array[0] = arg0;
  885.       Array[1] = arg1;
  886.       Array[2] = arg2;
  887.       Array[3] = arg3;
  888.     }
  889.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4)
  890.     {
  891.       Array = new T[Count = 5];
  892.       Array[0] = arg0;
  893.       Array[1] = arg1;
  894.       Array[2] = arg2;
  895.       Array[3] = arg3;
  896.       Array[4] = arg4;
  897.     }
  898.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5)
  899.     {
  900.       Array = new T[Count = 6];
  901.       Array[0] = arg0;
  902.       Array[1] = arg1;
  903.       Array[2] = arg2;
  904.       Array[3] = arg3;
  905.       Array[4] = arg4;
  906.       Array[5] = arg5;
  907.     }
  908.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6)
  909.     {
  910.       Array = new T[Count = 7];
  911.       Array[0] = arg0;
  912.       Array[1] = arg1;
  913.       Array[2] = arg2;
  914.       Array[3] = arg3;
  915.       Array[4] = arg4;
  916.       Array[5] = arg5;
  917.       Array[6] = arg6;
  918.     }
  919.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  920.                          T arg7)
  921.     {
  922.       Array = new T[Count = 8];
  923.       Array[0] = arg0;
  924.       Array[1] = arg1;
  925.       Array[2] = arg2;
  926.       Array[3] = arg3;
  927.       Array[4] = arg4;
  928.       Array[5] = arg5;
  929.       Array[6] = arg6;
  930.       Array[7] = arg7;
  931.     }
  932.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  933.                          T arg7, T arg8)
  934.     {
  935.       Array = new T[Count = 9];
  936.       Array[0] = arg0;
  937.       Array[1] = arg1;
  938.       Array[2] = arg2;
  939.       Array[3] = arg3;
  940.       Array[4] = arg4;
  941.       Array[5] = arg5;
  942.       Array[6] = arg6;
  943.       Array[7] = arg7;
  944.       Array[8] = arg8;
  945.     }
  946.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  947.                          T arg7, T arg8, T arg9)
  948.     {
  949.       Array = new T[Count = 10];
  950.       Array[0] = arg0;
  951.       Array[1] = arg1;
  952.       Array[2] = arg2;
  953.       Array[3] = arg3;
  954.       Array[4] = arg4;
  955.       Array[5] = arg5;
  956.       Array[6] = arg6;
  957.       Array[7] = arg7;
  958.       Array[8] = arg8;
  959.       Array[9] = arg9;
  960.     }
  961.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  962.                          T arg7, T arg8, T arg9, T arg10)
  963.     {
  964.       Array = new T[Count = 11];
  965.       Array[0] = arg0;
  966.       Array[1] = arg1;
  967.       Array[2] = arg2;
  968.       Array[3] = arg3;
  969.       Array[4] = arg4;
  970.       Array[5] = arg5;
  971.       Array[6] = arg6;
  972.       Array[7] = arg7;
  973.       Array[8] = arg8;
  974.       Array[9] = arg9;
  975.       Array[10] = arg10;
  976.     }
  977.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  978.                          T arg7, T arg8, T arg9, T arg10, T arg11)
  979.     {
  980.       Array = new T[Count = 12];
  981.       Array[0] = arg0;
  982.       Array[1] = arg1;
  983.       Array[2] = arg2;
  984.       Array[3] = arg3;
  985.       Array[4] = arg4;
  986.       Array[5] = arg5;
  987.       Array[6] = arg6;
  988.       Array[7] = arg7;
  989.       Array[8] = arg8;
  990.       Array[9] = arg9;
  991.       Array[10] = arg10;
  992.       Array[11] = arg11;
  993.     }
  994.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  995.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12)
  996.     {
  997.       Array = new T[Count = 13];
  998.       Array[0] = arg0;
  999.       Array[1] = arg1;
  1000.       Array[2] = arg2;
  1001.       Array[3] = arg3;
  1002.       Array[4] = arg4;
  1003.       Array[5] = arg5;
  1004.       Array[6] = arg6;
  1005.       Array[7] = arg7;
  1006.       Array[8] = arg8;
  1007.       Array[9] = arg9;
  1008.       Array[10] = arg10;
  1009.       Array[11] = arg11;
  1010.       Array[12] = arg12;
  1011.     }
  1012.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1013.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1014.                          T arg13)
  1015.     {
  1016.       Array = new T[Count = 14];
  1017.       Array[0] = arg0;
  1018.       Array[1] = arg1;
  1019.       Array[2] = arg2;
  1020.       Array[3] = arg3;
  1021.       Array[4] = arg4;
  1022.       Array[5] = arg5;
  1023.       Array[6] = arg6;
  1024.       Array[7] = arg7;
  1025.       Array[8] = arg8;
  1026.       Array[9] = arg9;
  1027.       Array[10] = arg10;
  1028.       Array[11] = arg11;
  1029.       Array[12] = arg12;
  1030.       Array[13] = arg13;
  1031.     }
  1032.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1033.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1034.                          T arg13, T arg14)
  1035.     {
  1036.       Array = new T[Count = 15];
  1037.       Array[0] = arg0;
  1038.       Array[1] = arg1;
  1039.       Array[2] = arg2;
  1040.       Array[3] = arg3;
  1041.       Array[4] = arg4;
  1042.       Array[5] = arg5;
  1043.       Array[6] = arg6;
  1044.       Array[7] = arg7;
  1045.       Array[8] = arg8;
  1046.       Array[9] = arg9;
  1047.       Array[10] = arg10;
  1048.       Array[11] = arg11;
  1049.       Array[12] = arg12;
  1050.       Array[13] = arg13;
  1051.       Array[14] = arg14;
  1052.     }
  1053.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1054.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1055.                          T arg13, T arg14, T arg15)
  1056.     {
  1057.       Array = new T[Count = 16];
  1058.       Array[0] = arg0;
  1059.       Array[1] = arg1;
  1060.       Array[2] = arg2;
  1061.       Array[3] = arg3;
  1062.       Array[4] = arg4;
  1063.       Array[5] = arg5;
  1064.       Array[6] = arg6;
  1065.       Array[7] = arg7;
  1066.       Array[8] = arg8;
  1067.       Array[9] = arg9;
  1068.       Array[10] = arg10;
  1069.       Array[11] = arg11;
  1070.       Array[12] = arg12;
  1071.       Array[13] = arg13;
  1072.       Array[14] = arg14;
  1073.       Array[15] = arg15;
  1074.     }
  1075.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1076.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1077.                          T arg13, T arg14, T arg15, T arg16)
  1078.     {
  1079.       Array = new T[Count = 17];
  1080.       Array[0] = arg0;
  1081.       Array[1] = arg1;
  1082.       Array[2] = arg2;
  1083.       Array[3] = arg3;
  1084.       Array[4] = arg4;
  1085.       Array[5] = arg5;
  1086.       Array[6] = arg6;
  1087.       Array[7] = arg7;
  1088.       Array[8] = arg8;
  1089.       Array[9] = arg9;
  1090.       Array[10] = arg10;
  1091.       Array[11] = arg11;
  1092.       Array[12] = arg12;
  1093.       Array[13] = arg13;
  1094.       Array[14] = arg14;
  1095.       Array[15] = arg15;
  1096.       Array[16] = arg16;
  1097.     }
  1098.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1099.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1100.                          T arg13, T arg14, T arg15, T arg16, T arg17)
  1101.     {
  1102.       Array = new T[Count = 18];
  1103.       Array[0] = arg0;
  1104.       Array[1] = arg1;
  1105.       Array[2] = arg2;
  1106.       Array[3] = arg3;
  1107.       Array[4] = arg4;
  1108.       Array[5] = arg5;
  1109.       Array[6] = arg6;
  1110.       Array[7] = arg7;
  1111.       Array[8] = arg8;
  1112.       Array[9] = arg9;
  1113.       Array[10] = arg10;
  1114.       Array[11] = arg11;
  1115.       Array[12] = arg12;
  1116.       Array[13] = arg13;
  1117.       Array[14] = arg14;
  1118.       Array[15] = arg15;
  1119.       Array[16] = arg16;
  1120.       Array[17] = arg17;
  1121.     }
  1122.     __fastcall OpenArray(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5, T arg6,
  1123.                          T arg7, T arg8, T arg9, T arg10, T arg11, T arg12,
  1124.                          T arg13, T arg14, T arg15, T arg16, T arg17, T arg18)
  1125.     {
  1126.       Array = new T[Count = 19];
  1127.       Array[0] = arg0;
  1128.       Array[1] = arg1;
  1129.       Array[2] = arg2;
  1130.       Array[3] = arg3;
  1131.       Array[4] = arg4;
  1132.       Array[5] = arg5;
  1133.       Array[6] = arg6;
  1134.       Array[7] = arg7;
  1135.       Array[8] = arg8;
  1136.       Array[9] = arg9;
  1137.       Array[10] = arg10;
  1138.       Array[11] = arg11;
  1139.       Array[12] = arg12;
  1140.       Array[13] = arg13;
  1141.       Array[14] = arg14;
  1142.       Array[15] = arg15;
  1143.       Array[16] = arg16;
  1144.       Array[17] = arg17;
  1145.       Array[18] = arg18;
  1146.     }
  1147.     __fastcall OpenArray(const OpenArray& src)
  1148.     {
  1149.       Array = new T[Count = src.Count];
  1150.       for (int i = 0; i < Count; i++)
  1151.         Array[i] = src.Array[i];
  1152.     }
  1153.     __fastcall ~OpenArray() {delete [] Array;}
  1154.     OpenArray& __fastcall operator =(const OpenArray& rhs);
  1155.     __fastcall operator T*() {return Array;}
  1156.     int __fastcall GetHigh() {return Count - 1;}
  1157.  
  1158.   private:
  1159.     T* Array;
  1160.     long Count;
  1161. };
  1162. //-----------------------------------------------------------------------
  1163. template<class T>
  1164. OpenArray& __fastcall
  1165. OpenArray<T>::operator =(const OpenArray& rhs)
  1166. {
  1167.   if (this != &rhs)
  1168.   {
  1169.     Array = new T[Count = rhs.Count];
  1170.     for (int i = 0; i < Count; i++)
  1171.       Array[i] = rhs.Array[i];
  1172.   }
  1173.   return *this;
  1174. }
  1175. //-----------------------------------------------------------------------
  1176. // Used with OPENARRAY macro (immediately following this template declaration)
  1177. template<class T> class OpenArrayCount
  1178. {
  1179.   public:
  1180.     __fastcall OpenArrayCount(T arg0): Count(1) {}
  1181.     __fastcall OpenArrayCount(T arg0,T arg1): Count(2) {}
  1182.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2): Count(3) {}
  1183.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2,T arg3): Count(4) {}
  1184.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2,T arg3,T arg4): Count(5) {}
  1185.     __fastcall OpenArrayCount(T arg0,T arg1,T arg2,T arg3,T arg4, T arg5)
  1186.       : Count(6) {}
  1187.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1188.       T arg6): Count(7) {}
  1189.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1190.       T arg6, T arg7): Count(8) {}
  1191.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1192.       T arg6, T arg7, T arg8): Count(9) {}
  1193.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1194.       T arg6, T arg7, T arg8, T arg9): Count(10) {}
  1195.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1196.       T arg6, T arg7, T arg8, T arg9, T arg10): Count(11) {}
  1197.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1198.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11): Count(12) {}
  1199.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1200.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12): Count(13) {}
  1201.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1202.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13)
  1203.       : Count(14) {}
  1204.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1205.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1206.       T arg14): Count(15) {}
  1207.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1208.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1209.       T arg14, T arg15): Count(16) {}
  1210.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1211.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1212.       T arg14, T arg15, T arg16): Count(17) {}
  1213.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1214.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1215.       T arg14, T arg15, T arg16, T arg17): Count(18) {}
  1216.     __fastcall OpenArrayCount(T arg0, T arg1, T arg2, T arg3, T arg4, T arg5,
  1217.       T arg6, T arg7, T arg8, T arg9, T arg10, T arg11, T arg12, T arg13,
  1218.       T arg14, T arg15, T arg16, T arg17, T arg18): Count(19) {}
  1219.     int __fastcall GetHigh() {return Count - 1;}
  1220.   private:
  1221.     long Count;
  1222. };
  1223. //-----------------------------------------------------------------------
  1224. // OPENARRAY: construct an OpenArray<type> on the fly
  1225. //
  1226. #define OPENARRAY(type, values) \
  1227.         OpenArray<type>values, OpenArrayCount<type>values.GetHigh()
  1228. //-----------------------------------------------------------------------
  1229. // ARRAYOFCONST: construct an OpenArray<TVarRec> on the fly
  1230. //
  1231. #define ARRAYOFCONST(values) \
  1232.         OpenArray<TVarRec>values, OpenArrayCount<TVarRec>values.GetHigh()
  1233. //---------------------------------------------------------------------
  1234. #define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0]))
  1235. //-----------------------------------------------------------------------
  1236. // EXISTINGARRAY: pass an existing array where an open array is expected
  1237. #define EXISTINGARRAY(a) (a), ((sizeof(a)/sizeof(a[0]))-1)
  1238. //-----------------------------------------------------------------------
  1239. // SLICE: pass part of an existing array where an open array is expected
  1240. #define SLICE(a, n) (a), (n - 1)
  1241. //-----------------------------------------------------------------------
  1242. //forward declare AutoCmd - used by Variant's Exec function
  1243. class AutoCmd;
  1244. //-----------------------------------------------------------------------
  1245.  
  1246. // Required for windows.hpp
  1247. //
  1248. #if !defined(LOCALE_SYSTEM_DEFAULT)
  1249. # define NOW_UNDEF_LOCALE_SYSTEM_DEFAULT TRUE
  1250. # define LOCALE_SYSTEM_DEFAULT System::Smallint(2048)
  1251. #endif
  1252.  
  1253. //-----------------------------------------------------------------------
  1254. class __declspec(delphireturn) Variant: public TVarData
  1255. {
  1256.   friend class AutoCmd;
  1257.   friend ostream& operator <<(ostream& os, const Variant& arg);
  1258.   public:
  1259.     static Variant __fastcall CreateObject(const String& ProgID);
  1260.     static Variant __fastcall GetActiveObject(const String& ProgID);
  1261.     //ctors
  1262.     __fastcall Variant();
  1263.     __fastcall Variant(const Variant& src);
  1264.  
  1265.     //By value constructors
  1266.     __fastcall Variant(const short src);
  1267.     __fastcall Variant(const int src);
  1268.     __fastcall Variant(const float src);
  1269.     __fastcall Variant(const double src);
  1270.     __fastcall Variant(const Currency src);
  1271.     __fastcall Variant(const TDateTime src);
  1272.     __fastcall Variant(const bool src);
  1273.     __fastcall Variant(const WordBool src);
  1274.     __fastcall Variant(const Byte src);
  1275.     __fastcall Variant(const AnsiString& src);
  1276.     __fastcall Variant(const char* src); // treat as asciiz pointer
  1277.     __fastcall Variant(wchar_t* const src);
  1278.     __fastcall Variant(Ole2::IDispatch* const src);
  1279.     __fastcall Variant(Ole2::IUnknown* const src);
  1280.  
  1281.     //By ref constructors
  1282.     __fastcall Variant(short* src);
  1283.     __fastcall Variant(int* src);
  1284.     __fastcall Variant(float* src);
  1285.     __fastcall Variant(double* src);
  1286.     __fastcall Variant(Currency* src);
  1287.     __fastcall Variant(TDateTime* src);
  1288.     __fastcall Variant(WordBool* src);
  1289.     __fastcall Variant(Byte* src);
  1290.     __fastcall Variant(wchar_t** src);
  1291.  
  1292.     // constructor for array of variants of type varType
  1293.     __fastcall Variant(const int* bounds, const int boundsSize, Word varType);
  1294.  
  1295.     // constructor for one dimensional array of type Variant
  1296.     __fastcall Variant(const Variant* values, const int valuesSize);
  1297.  
  1298.     __fastcall ~Variant();
  1299.  
  1300.     //assignments
  1301.     Variant& __fastcall operator =(const Variant& rhs);
  1302.     Variant& __fastcall operator +=(const Variant& rhs);
  1303.     Variant& __fastcall operator -=(const Variant& rhs);
  1304.     Variant& __fastcall operator *=(const Variant& rhs);
  1305.     Variant& __fastcall operator /=(const Variant& rhs);
  1306.     Variant& __fastcall operator %=(const Variant& rhs);
  1307.     Variant& __fastcall operator &=(const Variant& rhs);
  1308.     Variant& __fastcall operator |=(const Variant& rhs);
  1309.     Variant& __fastcall operator ^=(const Variant& rhs);
  1310.     Variant& __fastcall operator <<=(const Variant& rhs);
  1311.     Variant& __fastcall operator >>=(const Variant& rhs);
  1312.  
  1313.     // comparisons (Variant on right)
  1314.     bool __fastcall operator ==(const Variant& rhs) const;
  1315.     bool __fastcall operator !=(const Variant& rhs) const;
  1316.     bool __fastcall operator <(const Variant& rhs) const;
  1317.     bool __fastcall operator >(const Variant& rhs) const;
  1318.     bool __fastcall operator <=(const Variant& rhs) const;
  1319.     bool __fastcall operator >=(const Variant& rhs) const;
  1320.  
  1321.     // comparisons (int on right)
  1322.     bool __fastcall operator ==(int rhs) const
  1323.       {return operator ==(Variant(rhs));}
  1324.     bool __fastcall operator !=(int rhs) const
  1325.       {return operator !=(Variant(rhs));}
  1326.     bool __fastcall operator < (int rhs) const
  1327.       {return operator < (Variant(rhs));}
  1328.     bool __fastcall operator > (int rhs) const
  1329.       {return operator > (Variant(rhs));}
  1330.     bool __fastcall operator <=(int rhs) const
  1331.       {return operator <=(Variant(rhs));}
  1332.     bool __fastcall operator >=(int rhs) const
  1333.       {return operator >=(Variant(rhs));}
  1334.  
  1335.     // comparisons (double on right)
  1336.     bool __fastcall operator ==(double rhs) const
  1337.       {return operator ==(Variant(rhs));}
  1338.     bool __fastcall operator !=(double rhs) const
  1339.       {return operator !=(Variant(rhs));}
  1340.     bool __fastcall operator < (double rhs) const
  1341.       {return operator <(Variant(rhs));}
  1342.     bool __fastcall operator > (double rhs) const
  1343.       {return operator >(Variant(rhs));}
  1344.     bool __fastcall operator <=(double rhs) const
  1345.       {return operator <=(Variant(rhs));}
  1346.     bool __fastcall operator >=(double rhs) const
  1347.       {return operator >=(Variant(rhs));}
  1348.  
  1349.     // binary operators (Variant on right)
  1350.     Variant __fastcall operator +(const Variant& rhs) const;
  1351.     Variant __fastcall operator -(const Variant& rhs) const;
  1352.     Variant __fastcall operator *(const Variant& rhs) const;
  1353.     Variant __fastcall operator /(const Variant& rhs) const;
  1354.     Variant __fastcall operator %(const Variant& rhs) const;
  1355.     Variant __fastcall operator &(const Variant& rhs) const;
  1356.     Variant __fastcall operator |(const Variant& rhs) const;
  1357.     Variant __fastcall operator ^(const Variant& rhs) const;
  1358.     Variant __fastcall operator <<(const Variant& rhs) const;
  1359.     Variant __fastcall operator >>(const Variant& rhs) const;
  1360.  
  1361.     // binary operators (AnsiString on right)
  1362.     Variant __fastcall operator -(const AnsiString& rhs) const
  1363.       {return operator -(Variant(rhs));}
  1364.     Variant __fastcall operator *(const AnsiString& rhs) const
  1365.       {return operator *(Variant(rhs));}
  1366.     Variant __fastcall operator /(const AnsiString& rhs) const
  1367.       {return operator /(Variant(rhs));}
  1368.     Variant __fastcall operator %(const AnsiString& rhs) const
  1369.       {return operator %(Variant(rhs));}
  1370.     Variant __fastcall operator &(const AnsiString& rhs) const
  1371.       {return operator &(Variant(rhs));}
  1372.     Variant __fastcall operator |(const AnsiString& rhs) const
  1373.       {return operator |(Variant(rhs));}
  1374.     Variant __fastcall operator ^(const AnsiString& rhs) const
  1375.       {return operator ^(Variant(rhs));}
  1376.     Variant __fastcall operator <<(const AnsiString& rhs) const
  1377.       {return operator <<(Variant(rhs));}
  1378.     Variant __fastcall operator >>(const AnsiString& rhs) const
  1379.       {return operator >>(Variant(rhs));}
  1380.  
  1381.     // binary operators (int on right)
  1382.     Variant __fastcall operator +(int rhs) const
  1383.       {return operator +(Variant(rhs));}
  1384.     Variant __fastcall operator -(int rhs) const
  1385.       {return operator -(Variant(rhs));}
  1386.     Variant __fastcall operator *(int rhs) const
  1387.       {return operator *(Variant(rhs));}
  1388.     Variant __fastcall operator /(int rhs) const
  1389.       {return operator /(Variant(rhs));}
  1390.     Variant __fastcall operator %(int rhs) const
  1391.       {return operator %(Variant(rhs));}
  1392.     Variant __fastcall operator &(int rhs) const
  1393.       {return operator &(Variant(rhs));}
  1394.     Variant __fastcall operator |(int rhs) const
  1395.       {return operator |(Variant(rhs));}
  1396.     Variant __fastcall operator ^(int rhs) const
  1397.       {return operator ^(Variant(rhs));}
  1398.     Variant __fastcall operator <<(int rhs) const
  1399.       {return operator <<(Variant(rhs));}
  1400.     Variant __fastcall operator >>(int rhs) const
  1401.       {return operator >>(Variant(rhs));}
  1402.  
  1403.     // binary operators (double on right)
  1404.     Variant __fastcall operator +(double rhs) const
  1405.       {return operator +(Variant(rhs));}
  1406.     Variant __fastcall operator -(double rhs) const
  1407.       {return operator -(Variant(rhs));}
  1408.     Variant __fastcall operator *(double rhs) const
  1409.       {return operator *(Variant(rhs));}
  1410.     Variant __fastcall operator /(double rhs) const
  1411.       {return operator /(Variant(rhs));}
  1412.     Variant __fastcall operator %(double rhs) const
  1413.       {return operator %(Variant(rhs));}
  1414.     Variant __fastcall operator &(double rhs) const
  1415.       {return operator &(Variant(rhs));}
  1416.     Variant __fastcall operator |(double rhs) const
  1417.       {return operator |(Variant(rhs));}
  1418.     Variant __fastcall operator ^(double rhs) const
  1419.       {return operator ^(Variant(rhs));}
  1420.     Variant __fastcall operator <<(double rhs) const
  1421.       {return operator <<(Variant(rhs));}
  1422.     Variant __fastcall operator >>(double rhs) const
  1423.       {return operator >>(Variant(rhs));}
  1424.  
  1425.     // unary operators
  1426.     Variant __fastcall operator -() const;
  1427.     Variant __fastcall operator !() const;
  1428.  
  1429.     // conversion operators
  1430.     __fastcall operator short() const;
  1431.     __fastcall operator int() const;
  1432.     __fastcall operator float() const;
  1433.     __fastcall operator double() const;
  1434.     __fastcall operator Currency() const;
  1435.     __fastcall operator TDateTime() const;
  1436.     __fastcall operator bool() const;
  1437.     __fastcall operator WordBool() const;
  1438.     __fastcall operator Byte() const;
  1439.     __fastcall operator AnsiString() const;
  1440.     __fastcall operator Ole2::IDispatch*();
  1441.     __fastcall operator Ole2::IUnknown*();
  1442.  
  1443.     // by ref conversion operators
  1444.     __fastcall operator short*();
  1445.     __fastcall operator int*();
  1446.     __fastcall operator float*();
  1447.     __fastcall operator double*();
  1448.     __fastcall operator Currency*();
  1449.     __fastcall operator TDateTime*();
  1450.     __fastcall operator WordBool*();
  1451.     __fastcall operator Byte*();
  1452.     __fastcall operator wchar_t**();
  1453.  
  1454.     // HRESULT methods
  1455.     void __fastcall SetError(const Integer err);
  1456.     Integer __fastcall GetError() const;
  1457.  
  1458.     void __fastcall Clear();
  1459.     Variant& __fastcall ChangeType(int VarType);
  1460.     Variant __fastcall AsType(int VarType) const;
  1461.  
  1462.     int __fastcall Type() const;
  1463.     bool __fastcall IsNull() const;
  1464.     bool __fastcall IsEmpty() const;
  1465.  
  1466.     // variant array stuff
  1467.     bool    __fastcall IsArray() const;
  1468.     Variant __fastcall GetElement(const int i1) const;
  1469.     Variant __fastcall GetElement(const int i1, const int i2) const;
  1470.     Variant __fastcall GetElement(const int i1, const int i2, const int i3)
  1471.       const;
  1472.     Variant __fastcall GetElement(const int i1, const int i2, const int i3,
  1473.       const int i4) const;
  1474.     Variant __fastcall GetElement(const int i1, const int i2, const int i3,
  1475.       const int i4, const int i5) const;
  1476.     void __fastcall PutElement(const Variant& data, const int i1);
  1477.     void __fastcall PutElement(const Variant& data, const int i1, const int i2);
  1478.     void __fastcall PutElement(const Variant& data, const int i1, const int i2,
  1479.       const int i3);
  1480.     void __fastcall PutElement(const Variant& data, const int i1, const int i2,
  1481.       const int i3, const int i4);
  1482.     void __fastcall PutElement(const Variant& data, const int i1, const int i2,
  1483.       const int i3, const int i4, const int i5);
  1484.     int __fastcall ArrayDimCount() const;
  1485.     int __fastcall ArrayLowBound(const int dim = 1) const;
  1486.     int __fastcall ArrayHighBound(const int dim = 1) const;
  1487.     void __fastcall ArrayRedim(int highBound);
  1488.     Pointer __fastcall ArrayLock();
  1489.     void    __fastcall ArrayUnlock();
  1490.  
  1491.     // Automation Goodies
  1492.     Variant __fastcall Exec(AutoCmd& cmd, Integer lcid = LOCALE_SYSTEM_DEFAULT) const;
  1493.  
  1494.     // Alternate Syntax for Automation
  1495.     // (Doesn't support Named Parameters for now)
  1496.     void OleProcedure(const String& name, Variant& v0 = Variant(),
  1497.       Variant& v1 = Variant(),Variant& v2 = Variant(),Variant& v3 = Variant(),
  1498.       Variant& v4 = Variant(),Variant& v5 = Variant(),Variant& v6 = Variant(),
  1499.       Variant& v7 = Variant(),Variant& v8 = Variant(),Variant& v9 = Variant()) const;
  1500.     Variant OleFunction(const String& name, Variant& v0 = Variant(),
  1501.       Variant& v1 = Variant(),Variant& v2 = Variant(),Variant& v3 = Variant(),
  1502.       Variant& v4 = Variant(),Variant& v5 = Variant(),Variant& v6 = Variant(),
  1503.       Variant& v7 = Variant(),Variant& v8 = Variant(),Variant& v9 = Variant()) const;
  1504.     Variant OlePropertyGet(const String& name, Variant& v0 = Variant(),
  1505.       Variant& v1 = Variant(),Variant& v2 = Variant(),Variant& v3 = Variant(),
  1506.       Variant& v4 = Variant(),Variant& v5 = Variant(),Variant& v6 = Variant(),
  1507.       Variant& v7 = Variant(),Variant& v8 = Variant(),Variant& v9 = Variant()) const;
  1508.     void OlePropertySet(const String& name, Variant& v0 = Variant(),
  1509.       Variant& v1 = Variant(),Variant& v2 = Variant(),Variant& v3 = Variant(),
  1510.       Variant& v4 = Variant(),Variant& v5 = Variant(),Variant& v6 = Variant(),
  1511.       Variant& v7 = Variant(),Variant& v8 = Variant(),Variant& v9 = Variant()) const;
  1512.     // End of Alternate Syntax for Automation
  1513.   private:
  1514.     // AutoCmd::GetParm & GetNamedParm uses operator [] (AutoCmd is a friend)
  1515.     // operator[] can only be used for arrays of type Variant
  1516.     Variant& __fastcall operator [](const int idx);
  1517. };
  1518.  
  1519. #ifdef NOW_UNDEF_LOCALE_SYSTEM_DEFAULT
  1520. #undef LOCALE_SYSTEM_DEFAULT
  1521. #endif
  1522. //-----------------------------------------------------------------------
  1523. //ostream& operator <<(ostream& os, const Variant& arg);
  1524. //-----------------------------------------------------------------------
  1525. // Variant global scope comparisons (int on left)
  1526. inline bool __fastcall operator ==(int lhs, const Variant& rhs)
  1527.   {return Variant(lhs).operator ==(rhs);}
  1528. inline bool __fastcall operator !=(int lhs, const Variant& rhs)
  1529.   {return Variant(lhs).operator !=(rhs);}
  1530. inline bool __fastcall operator < (int lhs, const Variant& rhs)
  1531.   {return Variant(lhs).operator < (rhs);}
  1532. inline bool __fastcall operator > (int lhs, const Variant& rhs)
  1533.   {return Variant(lhs).operator > (rhs);}
  1534. inline bool __fastcall operator <=(int lhs, const Variant& rhs)
  1535.   {return Variant(lhs).operator <=(rhs);}
  1536. inline bool __fastcall operator >=(int lhs, const Variant& rhs)
  1537.   {return Variant(lhs).operator >=(rhs);}
  1538.  
  1539. // Variant global scope comparisons (double on left)
  1540. inline bool __fastcall operator ==(double lhs, const Variant& rhs)
  1541.   {return Variant(lhs).operator ==(rhs);}
  1542. inline bool __fastcall operator !=(double lhs, const Variant& rhs)
  1543.   {return Variant(lhs).operator !=(rhs);}
  1544. inline bool __fastcall operator < (double lhs, const Variant& rhs)
  1545.   {return Variant(lhs).operator < (rhs);}
  1546. inline bool __fastcall operator > (double lhs, const Variant& rhs)
  1547.   {return Variant(lhs).operator > (rhs);}
  1548. inline bool __fastcall operator <=(double lhs, const Variant& rhs)
  1549.   {return Variant(lhs).operator <=(rhs);}
  1550. inline bool __fastcall operator >=(double lhs, const Variant& rhs)
  1551.   {return Variant(lhs).operator >=(rhs);}
  1552.  
  1553. // Variant binary global scope operators (AnsiString on left)
  1554. inline Variant __fastcall operator - (const AnsiString& lhs, const Variant& rhs)
  1555.   {return Variant(lhs).operator -(rhs);}
  1556. inline Variant __fastcall operator * (const AnsiString& lhs, const Variant& rhs)
  1557.   {return Variant(lhs).operator *(rhs);}
  1558. inline Variant __fastcall operator / (const AnsiString& lhs, const Variant& rhs)
  1559.   {return Variant(lhs).operator /(rhs);}
  1560. inline Variant __fastcall operator % (const AnsiString& lhs, const Variant& rhs)
  1561.   {return Variant(lhs).operator %(rhs);}
  1562. inline Variant __fastcall operator & (const AnsiString& lhs, const Variant& rhs)
  1563.   {return Variant(lhs).operator &(rhs);}
  1564. inline Variant __fastcall operator | (const AnsiString& lhs, const Variant& rhs)
  1565.   {return Variant(lhs).operator |(rhs);}
  1566. inline Variant __fastcall operator ^ (const AnsiString& lhs, const Variant& rhs)
  1567.   {return Variant(lhs).operator ^(rhs);}
  1568. inline Variant __fastcall operator <<(const AnsiString& lhs, const Variant& rhs)
  1569.   {return Variant(lhs).operator <<(rhs);}
  1570. inline Variant __fastcall operator >>(const AnsiString& lhs, const Variant& rhs)
  1571.   {return Variant(lhs).operator >>(rhs);}
  1572.  
  1573. // Variant binary global scope operators (int on left)
  1574. inline Variant __fastcall operator +(int lhs, const Variant& rhs)
  1575.   {return Variant(lhs).operator +(rhs);}
  1576. inline Variant __fastcall operator -(int lhs, const Variant& rhs)
  1577.   {return Variant(lhs).operator -(rhs);}
  1578. inline Variant __fastcall operator *(int lhs, const Variant& rhs)
  1579.   {return Variant(lhs).operator *(rhs);}
  1580. inline Variant __fastcall operator /(int lhs, const Variant& rhs)
  1581.   {return Variant(lhs).operator /(rhs);}
  1582. inline Variant __fastcall operator %(int lhs, const Variant& rhs)
  1583.   {return Variant(lhs).operator %(rhs);}
  1584. inline Variant __fastcall operator &(int lhs, const Variant& rhs)
  1585.   {return Variant(lhs).operator &(rhs);}
  1586. inline Variant __fastcall operator |(int lhs, const Variant& rhs)
  1587.   {return Variant(lhs).operator |(rhs);}
  1588. inline Variant __fastcall operator ^(int lhs, const Variant& rhs)
  1589.   {return Variant(lhs).operator ^(rhs);}
  1590. inline Variant __fastcall operator <<(int lhs, const Variant& rhs)
  1591.   {return Variant(lhs).operator <<(rhs);}
  1592. inline Variant __fastcall operator >>(int lhs, const Variant& rhs)
  1593.   {return Variant(lhs).operator >>(rhs);}
  1594.  
  1595. // Variant binary global scope operators (double on left)
  1596. inline Variant __fastcall operator +(double lhs, const Variant& rhs)
  1597.   {return Variant(lhs).operator +(rhs);}
  1598. inline Variant __fastcall operator -(double lhs, const Variant& rhs)
  1599.   {return Variant(lhs).operator -(rhs);}
  1600. inline Variant __fastcall operator *(double lhs, const Variant& rhs)
  1601.   {return Variant(lhs).operator *(rhs);}
  1602. inline Variant __fastcall operator /(double lhs, const Variant& rhs)
  1603.   {return Variant(lhs).operator /(rhs);}
  1604. inline Variant __fastcall operator %(double lhs, const Variant& rhs)
  1605.   {return Variant(lhs).operator %(rhs);}
  1606. inline Variant __fastcall operator &(double lhs, const Variant& rhs)
  1607.   {return Variant(lhs).operator &(rhs);}
  1608. inline Variant __fastcall operator |(double lhs, const Variant& rhs)
  1609.   {return Variant(lhs).operator |(rhs);}
  1610. inline Variant __fastcall operator ^(double lhs, const Variant& rhs)
  1611.   {return Variant(lhs).operator ^(rhs);}
  1612. inline Variant __fastcall operator <<(double lhs, const Variant& rhs)
  1613.   {return Variant(lhs).operator <<(rhs);}
  1614. inline Variant __fastcall operator >>(double lhs, const Variant& rhs)
  1615.   {return Variant(lhs).operator >>(rhs);}
  1616.  
  1617. //-----------------------------------------------------------------------
  1618. //forward declare NamedParm - used by AutoArg's operator << function
  1619. class NamedParm;
  1620. //-----------------------------------------------------------------------
  1621. class AutoCmd
  1622. {
  1623.   public:
  1624.     AutoCmd(const String& name): Name(name) {}
  1625.     AutoCmd(const AutoCmd& src);
  1626.     virtual AutoCmd& SetName(const String& name);
  1627.  
  1628.     //Named arg
  1629.     virtual AutoCmd& operator <<(const NamedParm& np);
  1630.     //By value args
  1631.     virtual AutoCmd& operator <<(const Variant& arg);
  1632.     virtual AutoCmd& operator <<(const short arg);
  1633.     virtual AutoCmd& operator <<(const int arg);
  1634.     virtual AutoCmd& operator <<(const float arg);
  1635.     virtual AutoCmd& operator <<(const double arg);
  1636.     virtual AutoCmd& operator <<(const Currency arg);
  1637.     virtual AutoCmd& operator <<(const TDateTime arg);
  1638.     virtual AutoCmd& operator <<(const bool arg);
  1639.     virtual AutoCmd& operator <<(const WordBool arg);
  1640.     virtual AutoCmd& operator <<(const Byte arg);
  1641.     virtual AutoCmd& operator <<(const AnsiString& arg);
  1642.     virtual AutoCmd& operator <<(const char* arg) // treat as asciiz pointer
  1643.       {return operator <<(AnsiString(arg));}
  1644.     virtual AutoCmd& operator <<(Ole2::IDispatch* const arg);
  1645.     virtual AutoCmd& operator <<(Ole2::IUnknown* const arg);
  1646.     //By ref args
  1647.     virtual AutoCmd& operator <<(Variant* arg);
  1648.     virtual AutoCmd& operator <<(short* arg);
  1649.     virtual AutoCmd& operator <<(int* arg);
  1650.     virtual AutoCmd& operator <<(float* arg);
  1651.     virtual AutoCmd& operator <<(double* arg);
  1652.     virtual AutoCmd& operator <<(Currency* arg);
  1653.     virtual AutoCmd& operator <<(TDateTime* arg);
  1654.     virtual AutoCmd& operator <<(WordBool* arg);
  1655.     virtual AutoCmd& operator <<(Byte* arg);
  1656.     virtual AutoCmd& operator <<(AnsiString* arg);
  1657.  
  1658.     virtual AutoCmd& Clear();       // ClearName() + ClearArgs()
  1659.     virtual AutoCmd& ClearName();   // SetName("")
  1660.     virtual AutoCmd& ClearArgs();   // Clear Parms and NamedParms
  1661.  
  1662.     virtual Byte GetCallType() const = 0;
  1663.     virtual bool RequestResult() const = 0;
  1664.     virtual int GetArgType(const Byte idx) const;
  1665.     virtual int GetNamedArgType(const Byte idx) const;
  1666.     virtual String GetName() const { return Name; }
  1667.     virtual Byte GetArgCount() const;
  1668.     virtual Byte GetNamedArgCount() const;
  1669.     virtual Variant& GetParm(const Byte idx);
  1670.     virtual Variant& GetNamedParm(const Byte idx);
  1671.     virtual String GetNamedParmName(const Byte idx) const;
  1672.     virtual String GetStringArg(const Byte idx) {return StringArgs[idx];}
  1673.     virtual String* GetStringPtr(const Byte idx) {return StringPtrs[idx];}
  1674.     virtual String GetNamedStringArg(const Byte idx) {return NamedStringArgs[idx];}
  1675.     virtual String* GetNamedStringPtr(const Byte idx) {return NamedStringPtrs[idx];}
  1676.  
  1677.   protected:
  1678.     void AddElement();
  1679.     String Name;            // name of command
  1680.     Variant Parms;          // positional arguments
  1681.     Variant ParmTypes;      // types of positional arguments
  1682.     Variant NamedParms;     // named arguments
  1683.     Variant NamedParmTypes; // types of named arguments
  1684.     Variant NamedParmNames; // names of named arguments
  1685.     AnsiString StringArgs[32];       // MaxDispArgs = 32 in oleauto.hpp
  1686.     AnsiString* StringPtrs[32];      // MaxDispArgs = 32 in oleauto.hpp
  1687.     AnsiString NamedStringArgs[32];  // MaxDispArgs = 32 in oleauto.hpp
  1688.     AnsiString* NamedStringPtrs[32]; // MaxDispArgs = 32 in oleauto.hpp
  1689. };
  1690. //-----------------------------------------------------------------------
  1691. class NamedParm
  1692. {
  1693.   public:
  1694. //    NamedParm(const String& name, Variant& parm): Name(name), Parm(parm) {}
  1695.     //By value ctors
  1696.     NamedParm(const String& name, const Variant& arg):
  1697.       Name(name), Type(varVariant), Parm(arg) {}
  1698.     NamedParm(const String& name, const short arg):
  1699.       Name(name), Type(varSmallint), Parm(arg) {}
  1700.     NamedParm(const String& name, const int arg):
  1701.       Name(name), Type(varInteger), Parm(arg) {}
  1702.     NamedParm(const String& name, const float arg):
  1703.       Name(name), Type(varSingle), Parm(arg) {}
  1704.     NamedParm(const String& name, const double arg):
  1705.       Name(name), Type(varDouble), Parm(arg) {}
  1706.     NamedParm(const String& name, const Currency arg):
  1707.       Name(name), Type(varCurrency), Parm(arg) {}
  1708.     NamedParm(const String& name, const TDateTime arg):
  1709.       Name(name), Type(varDate), Parm(arg) {}
  1710.     NamedParm(const String& name, const bool arg):
  1711.       Name(name), Type(varBoolean), Parm(arg) {}
  1712.     NamedParm(const String& name, const WordBool arg):
  1713.       Name(name), Type(varBoolean), Parm(arg) {}
  1714.     NamedParm(const String& name, const Byte arg):
  1715.       Name(name), Type(varByte), Parm(arg) {}
  1716.     NamedParm(const String& name, const AnsiString& arg):
  1717.       Name(name), Type(varString), StringParm(arg) {}
  1718.     NamedParm(const String& name, const char* arg): // treat as asciiz pointer
  1719.       Name(name), Type(varString), StringParm(arg) {}
  1720.     NamedParm(const String& name, Ole2::IDispatch* const arg):
  1721.       Name(name), Type(varDispatch), Parm(arg) {}
  1722.     NamedParm(const String& name, Ole2::IUnknown* const arg):
  1723.       Name(name), Type(varUnknown), Parm(arg) {}
  1724.     //By ref ctors
  1725.     NamedParm(const String& name, Variant* arg);
  1726.     NamedParm(const String& name, short* arg):
  1727.       Name(name), Type(varSmallint | varByRef), Parm(arg) {}
  1728.     NamedParm(const String& name, int* arg):
  1729.       Name(name), Type(varInteger | varByRef), Parm(arg) {}
  1730.     NamedParm(const String& name, float* arg):
  1731.       Name(name), Type(varSingle | varByRef), Parm(arg) {}
  1732.     NamedParm(const String& name, double* arg):
  1733.       Name(name), Type(varDouble | varByRef), Parm(arg) {}
  1734.     NamedParm(const String& name, Currency* arg):
  1735.       Name(name), Type(varCurrency | varByRef), Parm(arg) {}
  1736.     NamedParm(const String& name, TDateTime* arg):
  1737.       Name(name), Type(varDate | varByRef), Parm(arg) {}
  1738.     NamedParm(const String& name, WordBool* arg):
  1739.       Name(name), Type(varBoolean | varByRef), Parm(arg) {}
  1740.     NamedParm(const String& name, Byte* arg):
  1741.       Name(name), Type(varByte | varByRef), Parm(arg) {}
  1742.     NamedParm(const String& name, String* arg):
  1743.       Name(name), Type(varString | varByRef), StringPtr(arg) {}
  1744.  
  1745.     virtual Variant GetParm() const { return Parm; }
  1746.     virtual AnsiString GetStringParm() const { return StringParm; }
  1747.     virtual AnsiString* GetStringPtr() const { return StringPtr; }
  1748.     virtual int GetType() const { return Type; }
  1749.     virtual String GetParmName() const { return Name; }
  1750.   protected:
  1751.     void AddElement();
  1752.     String Name;
  1753.     Variant Parm;
  1754.     AnsiString StringParm;
  1755.     AnsiString* StringPtr;
  1756.     int Type;
  1757. };
  1758. //-----------------------------------------------------------------------
  1759. class Procedure: public AutoCmd
  1760. {
  1761.   public:
  1762.     Procedure(const String& name): AutoCmd(name) {}
  1763.     Procedure(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const Procedure*>(&src);}
  1764.     virtual Byte GetCallType() const;
  1765.     virtual bool RequestResult() const { return false; }
  1766. };
  1767. //-----------------------------------------------------------------------
  1768. class Function: public AutoCmd
  1769. {
  1770.   public:
  1771.     Function(const String& name): AutoCmd(name) {}
  1772.     Function(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const Function*>(&src);}
  1773.     virtual Byte GetCallType() const;
  1774.     virtual bool RequestResult() const { return true; }
  1775. };
  1776. //-----------------------------------------------------------------------
  1777. class PropertySet: public AutoCmd
  1778. {
  1779.   public:
  1780.     PropertySet(const String& name): AutoCmd(name) {}
  1781.     PropertySet(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const PropertySet*>(&src);}
  1782.     virtual Byte GetCallType() const;
  1783.     virtual bool RequestResult() const { return false; }
  1784. };
  1785. //-----------------------------------------------------------------------
  1786. class PropertyGet: public AutoCmd
  1787. {
  1788.   public:
  1789.     PropertyGet(const String& name): AutoCmd(name) {}
  1790.     PropertyGet(const AutoCmd& src): AutoCmd(src) {dynamic_cast<const PropertyGet*>(&src);}
  1791.     virtual Byte GetCallType() const;
  1792.     virtual bool RequestResult() const { return true; }
  1793. };
  1794. //-----------------------------------------------------------------------
  1795. typedef class TMemoryManager *PMemoryManager;
  1796.  
  1797. class TMemoryManager {
  1798.   public:
  1799.         Pointer __fastcall (*GetMem)(Integer Size);
  1800.         Integer __fastcall (*FreeMem)(Pointer P);
  1801.         Pointer __fastcall (*ReallocMem)(Pointer P, Integer Size);
  1802. } ;
  1803.  
  1804. class THeapStatus {
  1805.   public:
  1806.     Cardinal TotalAddrSpace;
  1807.     Cardinal TotalUncommitted;
  1808.     Cardinal TotalCommitted;
  1809.     Cardinal TotalAllocated;
  1810.     Cardinal TotalFree;
  1811.     Cardinal FreeSmall;
  1812.     Cardinal FreeBig;
  1813.     Cardinal Unused;
  1814.     Cardinal Overhead;
  1815.     Cardinal HeapErrorCode;
  1816. } ;
  1817.  
  1818. typedef Integer __fastcall (*TThreadFunc)(Pointer Parameter);
  1819.  
  1820.  
  1821. //---------------------------------------------------------------------
  1822. #define USEDATAMODULE(FileName, DataModuleName)  \
  1823.    class __declspec(delphiclass) T##DataModuleName;       \
  1824.    extern T##DataModuleName *DataModuleName;
  1825. //---------------------------------------------------------------------
  1826. #define USEDATAMODULENS(FileName, UnitName, DataModuleName)  \
  1827.    namespace UnitName {         \
  1828.    class __declspec(delphiclass) T##DataModuleName;       \
  1829.    extern T##DataModuleName *DataModuleName;              \
  1830.    };               \
  1831.    using namespace UnitName
  1832. //---------------------------------------------------------------------
  1833. #define USEFORM(FileName, FormName) \
  1834.    class __declspec(delphiclass) T##FormName;       \
  1835.    extern T##FormName *FormName;
  1836. //---------------------------------------------------------------------
  1837. #define USEFORMNS(FileName, UnitName, FormName) \
  1838.    namespace UnitName {         \
  1839.    class __declspec(delphiclass) T##FormName;       \
  1840.    extern T##FormName *FormName;          \
  1841.    };               \
  1842.    using namespace UnitName
  1843. //---------------------------------------------------------------------
  1844. #define USEUNIT(ModName) \
  1845.    extern DummyThatIsNeverReferenced
  1846. //---------------------------------------------------------------------------
  1847. #define USEOBJ(FileName) \
  1848.    extern DummyThatIsNeverReferenced
  1849. //-----------------------------------------------------------------------
  1850. #define USERC(FileName) \
  1851.    extern DummyThatIsNeverReferenced
  1852. //-----------------------------------------------------------------------
  1853. #define USEDEF(FileName) \
  1854.    extern DummyThatIsNeverReferenced
  1855. //-----------------------------------------------------------------------
  1856. #define USERES(FileName) \
  1857.    extern DummyThatIsNeverReferenced
  1858. //-----------------------------------------------------------------------
  1859. #define USELIB(FileName) \
  1860.    extern DummyThatIsNeverReferenced
  1861. //-----------------------------------------------------------------------
  1862. #define USEFILE(FileName) \
  1863.    extern DummyThatIsNeverReferenced
  1864. //-----------------------------------------------------------------------
  1865.  
  1866. }
  1867. using namespace System;
  1868. using System::TClass;
  1869.  
  1870. namespace Typinfo {
  1871.   struct  TTypeInfo;
  1872.   typedef TTypeInfo *PTypeInfo;
  1873. }
  1874.  
  1875. #if !defined(__typeinfo)
  1876. # define __typeinfo(type)  (PTypeInfo)TObject::ClassInfo(__classid(type))
  1877. #endif
  1878.  
  1879. #endif  //  SYSDEFS_H
  1880.  
  1881.